home *** CD-ROM | disk | FTP | other *** search
- /*
- *=============================================================================
- * tSippShader.c
- *-----------------------------------------------------------------------------
- * Tcl commands to set SIPP shader type and parameters.
- *-----------------------------------------------------------------------------
- * Copyright 1992 Mark Diekhans
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies. Mark Diekhans makes
- * no representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *-----------------------------------------------------------------------------
- * $Id: tSippShader.c,v 2.0 1992/11/02 03:56:37 markd Rel $
- *=============================================================================
- */
-
- #include "tSippInt.h"
- #include "shaders.h"
-
- extern void phong_shader(); /* ???Should be in sipp.h, but was deleted. */
-
- /*
- * A shader definition.
- */
- typedef struct {
- Shader *proc;
- void *surfDescPtr;
- int surfDescSize;
- } shaderDesc_t, *shaderDesc_pt;
-
- /*
- * Default opacity is completely opaque.
- */
- static Color defaultOpacity = {1.0, 1.0, 1.0};
-
- /*
- * Internal prototypes.
- */
- static void
- BindShaderToHandle _ANSI_ARGS_((tSippGlob_pt tSippGlobPtr,
- Shader *shaderProc,
- void *surfDescPtr,
- int surfDescSize,
- bool passDesc));
-
- /*=============================================================================
- * BindShaderToHandle --
- * Bind a shader and surface description to a handle, setting up the
- * table entry.
- *
- * Parameters:
- * o tSippGlobPtr (I) - Pointer to the Tcl SIPP globals. The handle is
- * returned in interp->result.
- * o shaderProc (I) - A pointer to the shader procedure.
- * o surfDescPtr (I) - A pointer to the surface descriptor.
- * o surfDescSize (I) - The size of the surface descriptor.
- * o passDesc (I) - If TRUE, then surfDescPtr is dynamically allocated
- * and ownership is passed to this routine. Otherwise it is assumed to be
- * a static and a copy is made.
- *-----------------------------------------------------------------------------
- */
- static void
- BindShaderToHandle (tSippGlobPtr, shaderProc, surfDescPtr, surfDescSize,
- passDesc)
- tSippGlob_pt tSippGlobPtr;
- Shader *shaderProc;
- void *surfDescPtr;
- int surfDescSize;
- bool passDesc;
- {
- shaderDesc_pt descPtr;
- shaderDesc_pt *descEntryPtr;
-
- descPtr = (shaderDesc_pt) ckalloc (sizeof (shaderDesc_t));
- if (passDesc) {
- descPtr->surfDescPtr = surfDescPtr;
- } else {
- descPtr->surfDescPtr = ckalloc (surfDescSize);
- memcpy (descPtr->surfDescPtr, surfDescPtr, surfDescSize);
- }
- descPtr->proc = shaderProc;
- descPtr->surfDescSize = surfDescSize;
-
- descEntryPtr = (shaderDesc_pt *)
- Tcl_HandleAlloc (tSippGlobPtr->shaderTblPtr,
- tSippGlobPtr->interp->result);
- *descEntryPtr = descPtr;
- }
-
- /*=============================================================================
- * TSippShaderHandleToPtr --
- * Utility procedure to convert an shader handle to an shader pointer.
- * For use of by functions outside of this module.
- * Parameters:
- * o tSippGlobPtr (I) - A pointer to the Tcl SIPP global structure.
- * o handle (I) - A shader handle.
- * o surfDescPtrPtr (O) - A pointer to the surface descritor is returned
- * here.
- * Returns:
- * A pointer to the shader procedure, or NULL if an error occured.
- *-----------------------------------------------------------------------------
- */
- Shader *
- TSippShaderHandleToPtr (tSippGlobPtr, handle, surfDescPtrPtr)
- tSippGlob_pt tSippGlobPtr;
- char *handle;
- void **surfDescPtrPtr;
- {
- shaderDesc_pt *descEntryPtr;
- shaderDesc_pt descPtr;
-
- descEntryPtr = (shaderDesc_pt *)
- Tcl_HandleXlate (tSippGlobPtr->interp,
- tSippGlobPtr->shaderTblPtr, handle);
- if (descEntryPtr == NULL)
- return NULL;
- descPtr = *descEntryPtr;
- *surfDescPtrPtr = descPtr->surfDescPtr;
- return descPtr->proc;
-
- } /* TSippShaderHandleToPtr */
-
- /*=============================================================================
- * SippShaderBasic --
- * Process the basic shader command:
- * SippShaderBasic ambient specular c3 color [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderBasic (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Surf_desc surfDesc;
-
- if ((argc < 5) || (argc > 6)) {
- Tcl_AppendResult (interp, "wrong # args: ", argv [0],
- " ambient specular c3 color [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.specular))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.c3))
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [4], &surfDesc.color))
- return TCL_ERROR;
- if (argc == 6) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [5], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, basic_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderBasic */
-
- /*=============================================================================
- * SippShaderPhong --
- * Process the Phong shader command:
- * SippShaderPhong ambient diffuse specular spec_exp color [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderPhong (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Phong_desc surfDesc;
-
- if ((argc < 6) || (argc > 7)) {
- Tcl_AppendResult (interp, "wrong # args: ", argv [0],
- " ambient diffuse specular spec_exp color [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.diffuse))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.specular))
- return TCL_ERROR;
- if (Tcl_GetInt (interp, argv [4], &surfDesc.spec_exp) != TCL_OK)
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [5], &surfDesc.color))
- return TCL_ERROR;
- if (argc == 7) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [6], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, phong_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderPhong */
-
- /*=============================================================================
- * SippShaderStrauss --
- * Process the strauss shader command:
- * SippShaderStrauss ambient smoothness metalness color [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderStrauss (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Strauss_desc surfDesc;
-
- if ((argc < 5) || (argc > 6)) {
- Tcl_AppendResult (interp, "wrong # args: ", argv [0],
- " ambient smoothness metalness color [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.smoothness))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.metalness))
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [4], &surfDesc.color))
- return TCL_ERROR;
- if (argc == 6) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [5], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, strauss_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderStrauss */
-
- /*=============================================================================
- * SippShaderWood --
- * Process the wood shader command:
- * SippShaderWood ambient specular c3 scale basecolor ringcolor [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderWood (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Wood_desc surfDesc;
-
- if ((argc < 7) || (argc > 8)) {
- Tcl_AppendResult (interp, "wrong # args: ", argv [0], " ambient",
- " specular c3 scale basecolor ringcolor [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.specular))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.c3))
- return TCL_ERROR;
- if (Tcl_GetDouble (interp, argv [4], &surfDesc.scale) != TCL_OK)
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [5], &surfDesc.base))
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [6], &surfDesc.ring))
- return TCL_ERROR;
- if (argc == 8) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [7], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, wood_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderWood */
-
- /*=============================================================================
- * SippShaderMarble --
- * Process the marble shader command:
- * SippShaderMarble ambient specular c3 scale basecolor stripcolor
- * [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderMarble (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Marble_desc surfDesc;
-
- if ((argc < 7) || (argc > 8)) {
- Tcl_AppendResult (tSippGlobPtr->interp, "wrong # args: ", argv [0],
- " ambient specular c3 scale basecolor stripcolor",
- " [opacity]", (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.specular))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.c3))
- return TCL_ERROR;
- if (Tcl_GetDouble (interp, argv [4], &surfDesc.scale) != TCL_OK)
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [5], &surfDesc.base))
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [6], &surfDesc.strip))
- return TCL_ERROR;
- if (argc == 8) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [7], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, marble_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderMarble */
-
- /*=============================================================================
- * SippShaderGranite --
- * Process the granite shader command:
- * SippShaderGranite ambient specular c3 scale color1 color2 [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderGranite (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Granite_desc surfDesc;
-
- if ((argc < 7) || (argc > 8)) {
- Tcl_AppendResult (tSippGlobPtr->interp, "wrong # args: ", argv [0],
- " ambient specular c3 scale color1 color2 [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.specular))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.c3))
- return TCL_ERROR;
- if (Tcl_GetDouble (interp, argv [4], &surfDesc.scale) != TCL_OK)
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [5], &surfDesc.col1))
- return TCL_ERROR;
- if (!TSippConvertColor (tSippGlobPtr, argv [6], &surfDesc.col2))
- return TCL_ERROR;
- if (argc == 8) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [7], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, granite_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderGranite */
-
- /*=============================================================================
- * SippShaderBozo --
- * Process the bozo shader command:
- * SippShaderBozo colorlist ambient specular c3 scale [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderBozo (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Bozo_desc *surfDescPtr;
- int descSize;
- char **colorsArgv;
- int colorsArgc, idx;
- Color *colorsPtr;
-
- if ((argc < 6) || (argc > 7)) {
- Tcl_AppendResult (tSippGlobPtr->interp, "wrong # args: ", argv [0],
- " colorlist ambient specular c3 scale [opacity]",
- (char *) NULL);
- return TCL_ERROR;
- }
- /*
- * Convert the color list, the array is part of the allocated surface
- * descriptor.
- */
- if (Tcl_SplitList (tSippGlobPtr->interp, argv [1], &colorsArgc,
- &colorsArgv) != TCL_OK)
- return TCL_ERROR;
-
- descSize = sizeof (Bozo_desc) + (colorsArgc * sizeof (Color));
- surfDescPtr = (Bozo_desc *) ckalloc (descSize);
- colorsPtr = (Color *) (((char *) surfDescPtr) + sizeof (Bozo_desc));
- surfDescPtr->colors = colorsPtr;
- surfDescPtr->no_of_cols = colorsArgc;
-
- for (idx = 0; idx < colorsArgc; idx++) {
- if (!TSippConvertColor (tSippGlobPtr, colorsArgv [idx],
- &colorsPtr [idx])) {
- goto errorExit;
- }
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDescPtr->ambient))
- goto errorExit;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDescPtr->specular))
- goto errorExit;
- if (!TSippConvertFraction (tSippGlobPtr, argv [4], &surfDescPtr->c3))
- goto errorExit;
- if (Tcl_GetDouble (interp, argv [5], &surfDescPtr->scale) != TCL_OK)
- goto errorExit;
- if (argc == 7) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [6],
- &surfDescPtr->opacity))
- return TCL_ERROR;
- } else
- surfDescPtr->opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, bozo_shader,
- surfDescPtr, descSize, TRUE);
-
- ckfree (colorsArgv);
- return TCL_OK;
- errorExit:
- ckfree (colorsArgv);
- ckfree (surfDescPtr);
- return TCL_ERROR;
-
- } /* SippShaderBozo */
-
- /*=============================================================================
- * SippShaderBumpy --
- * Process the bumpy shader command:
- * SippShaderBumpy shaderhandle scale [BUMPS] [HOLES]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderBumpy (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Bumpy_desc *surfDescPtr;
- int idx, surfDescSize;
- shaderDesc_pt *otherDescPtrPtr, otherDescPtr;
- double scale;
- bool bumpflag, holeflag;
-
- if ((argc < 3) || (argc > 5)) {
- Tcl_AppendResult (tSippGlobPtr->interp, "wrong # args: ", argv [0],
- " shaderhandle scale [BUMPS] [HOLES]",
- (char *) NULL);
- return TCL_ERROR;
- }
- otherDescPtrPtr = (shaderDesc_pt *)
- Tcl_HandleXlate (tSippGlobPtr->interp,
- tSippGlobPtr->shaderTblPtr, argv [1]);
- if (otherDescPtrPtr == NULL)
- return TCL_ERROR;
- otherDescPtr = *otherDescPtrPtr;
-
- if (Tcl_GetDouble (interp, argv [2], &scale) != TCL_OK)
- return TCL_ERROR;
-
- bumpflag = holeflag = FALSE;
-
- for (idx = 3 ; idx < argc; idx ++) {
- if (STREQU (argv [idx], "BUMPS"))
- bumpflag = TRUE;
- else if (STREQU (argv [idx], "HOLES"))
- holeflag = TRUE;
- else {
- Tcl_AppendResult (tSippGlobPtr->interp, "expected one of `BUMPS'",
- " or `HOLES', got `", argv [idx], "'",
- (char *) NULL);
- return TCL_ERROR;
- }
- }
- if ((!bumpflag) && (!holeflag))
- bumpflag = holeflag = TRUE;
-
- /*
- * Build up a surface descriptor that includes the other surface
- * descriptor as data. This way it all gets freed up when we delete
- * the bumpy shader.
- */
- surfDescSize = sizeof (Bumpy_desc) + otherDescPtr->surfDescSize;
- surfDescPtr = (Bumpy_desc *) ckalloc (surfDescSize);
-
- surfDescPtr->shader = otherDescPtr->proc;
- surfDescPtr->surface = ((char *) surfDescPtr) + sizeof (Bumpy_desc);
- memcpy (surfDescPtr->surface, otherDescPtr->surfDescPtr,
- otherDescPtr->surfDescSize);
-
- surfDescPtr->bumpflag = bumpflag;
- surfDescPtr->holeflag = holeflag;
- surfDescPtr->scale = scale;
-
- BindShaderToHandle (tSippGlobPtr, bumpy_shader,
- surfDescPtr, surfDescSize, TRUE);
- return TCL_OK;
-
- } /* SippShaderBumpy */
-
- /*=============================================================================
- * SippShaderPlanet --
- * Process the planet shader command:
- * SippShaderPlanet ambient specular c3 [opacity]
- *
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderPlanet (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- Surf_desc surfDesc;
-
- if ((argc < 4) || (argc > 5)) {
- Tcl_AppendResult (tSippGlobPtr->interp, "wrong # args: ", argv [0],
- " ambient specular c3 [opacity]", (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippConvertFraction (tSippGlobPtr, argv [1], &surfDesc.ambient))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [2], &surfDesc.specular))
- return TCL_ERROR;
- if (!TSippConvertFraction (tSippGlobPtr, argv [3], &surfDesc.c3))
- return TCL_ERROR;
-
- surfDesc.color.red = 0.0; /* Ignored */
- surfDesc.color.grn = 0.0;
- surfDesc.color.blu = 0.0;
-
- if (argc == 5) {
- if (!TSippConvertOpacity (tSippGlobPtr, argv [4], &surfDesc.opacity))
- return TCL_ERROR;
- } else
- surfDesc.opacity = defaultOpacity;
-
- BindShaderToHandle (tSippGlobPtr, planet_shader,
- &surfDesc, sizeof (surfDesc), FALSE);
- return TCL_OK;
-
- } /* SippShaderPlanet */
-
- /*=============================================================================
- * SippShaderDelete --
- * Implements the command:
- * SippShaderDelete shaderhandle
- * Note:
- * This procedure has standard Tcl command calling sematics. ClientData
- * contains a pointer to the Tcl SIPP global structure. This routine does not
- * delete the allocated surface descriptior, as pointers to it are saved in
- * SIPP data structures.
- *-----------------------------------------------------------------------------
- */
- static int
- SippShaderDelete (clientData, interp, argc, argv)
- char *clientData;
- Tcl_Interp *interp;
- int argc;
- char **argv;
- {
- tSippGlob_pt tSippGlobPtr = (tSippGlob_pt) clientData;
- int idx;
- handleList_t shaderList;
- handleList_t shaderEntryList;
-
- if (argc != 2) {
- Tcl_AppendResult (interp, "wrong # args: ", argv [0],
- " shaderlist", (char *) NULL);
- return TCL_ERROR;
- }
- if (!TSippHandleListConvert (tSippGlobPtr, tSippGlobPtr->shaderTblPtr,
- argv [1], &shaderList, &shaderEntryList))
- return TCL_ERROR;
-
- /*
- * Frees the entry and handle, but not the surface description.
- */
- for (idx = 0; idx < shaderList.len; idx++) {
- ckfree (shaderList.ptr [idx]);
- Tcl_HandleFree (tSippGlobPtr->shaderTblPtr,
- shaderEntryList.ptr [idx]);
- }
-
- TSippHandleListFree (&shaderList);
- TSippHandleListFree (&shaderEntryList);
- return TCL_OK;
-
- } /* SippShaderDelete */
-
-
- /*=============================================================================
- * TSippShaderInit --
- * Initialized the shader commands.
- *
- * Parameters:
- * o tSippGlobPtr (I) - Pointer to the top level global data structure.
- *-----------------------------------------------------------------------------
- */
- void
- TSippShaderInit (tSippGlobPtr)
- tSippGlob_pt tSippGlobPtr;
- {
- static tSippTclCmdTbl_t cmdTable [] = {
- {"SippShaderBasic", SippShaderBasic},
- {"SippShaderPhong", SippShaderPhong},
- {"SippShaderStrauss", SippShaderStrauss},
- {"SippShaderWood", SippShaderWood},
- {"SippShaderMarble", SippShaderMarble},
- {"SippShaderGranite", SippShaderGranite},
- {"SippShaderBozo", SippShaderBozo},
- {"SippShaderBumpy", SippShaderBumpy},
- {"SippShaderPlanet", SippShaderPlanet},
- {"SippShaderDelete", SippShaderDelete},
- {NULL, NULL}
- };
-
- tSippGlobPtr->shaderTblPtr =
- Tcl_HandleTblInit ("shader", sizeof (shaderDesc_t), 8);
-
- TSippInitCmds (tSippGlobPtr, cmdTable);
-
- } /* TSippShaderInit */
-